
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of InsumosData.
	/// </summary>
	public class InsumosData : Singleton<InsumosData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

        #region Methods

        #region Lectura

        /// <summary>
        /// Selects all records from the Insumos table by a foreign key.
        /// </summary>
        public IList<Insumos> ListarByNombreOrUnidadAndVendible(string nombre,string unidad, bool vendible)
        {
            var entidades = new List<Insumos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectInsumosByNombreAndUnidadAndVendible");

            BaseDatos.AddInParameter(comando, "nombre", DbType.String, nombre);
            BaseDatos.AddInParameter(comando, "unidad", DbType.String, unidad);
            BaseDatos.AddInParameter(comando, "vendible", DbType.Boolean, vendible);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Insumos
                    {
                        insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
                        nombre = lector.IsDBNull(lector.GetOrdinal("nombre")) ? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
                        unidad = lector.IsDBNull(lector.GetOrdinal("unidad")) ? default(string) : lector.GetString(lector.GetOrdinal("unidad")),
                        preparacionBasica = lector.IsDBNull(lector.GetOrdinal("preparacionBasica")) ? default(double) : lector.GetDouble(lector.GetOrdinal("preparacionBasica")),
                        vendible = lector.IsDBNull(lector.GetOrdinal("vendible")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("vendible")),
                        precio = lector.IsDBNull(lector.GetOrdinal("precio")) ? default(decimal) : MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precio"))),
                        stock = MathExpression.Round(lector.GetDouble(lector.GetOrdinal("stock"))),
                        costo = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("costo"))),
                        tieneLote = lector.IsDBNull(lector.GetOrdinal("tieneLote")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneLote")),
                        tieneVencimiento = lector.IsDBNull(lector.GetOrdinal("tieneVencimiento")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneVencimiento")),
                        requiereRefrigeracion = lector.IsDBNull(lector.GetOrdinal("requiereRefrigeracion")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("requiereRefrigeracion")),
                        descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Insumos table by a foreign key.
        /// </summary>
        public IList<Insumos> ListarByNombreOrUnidad(string nombre, string unidad)
        {
            var entidades = new List<Insumos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectInsumosByNombreAndUnidad");

            BaseDatos.AddInParameter(comando, "nombre", DbType.String, nombre);
            BaseDatos.AddInParameter(comando, "unidad", DbType.String, unidad);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Insumos
                    {
                        insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
                        nombre = lector.IsDBNull(lector.GetOrdinal("nombre")) ? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
                        unidad = lector.IsDBNull(lector.GetOrdinal("unidad")) ? default(string) : lector.GetString(lector.GetOrdinal("unidad")),
                        preparacionBasica = lector.IsDBNull(lector.GetOrdinal("preparacionBasica")) ? default(float) : lector.GetDouble(lector.GetOrdinal("preparacionBasica")),
                        vendible = lector.IsDBNull(lector.GetOrdinal("vendible")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("vendible")),
                        precio = lector.IsDBNull(lector.GetOrdinal("precio")) ? default(decimal) : MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precio"))),
                        stock = MathExpression.Round(lector.GetDouble(lector.GetOrdinal("stock"))),
                        costo = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("costo"))),
                        tieneLote = lector.IsDBNull(lector.GetOrdinal("tieneLote")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneLote")),
                        tieneVencimiento = lector.IsDBNull(lector.GetOrdinal("tieneVencimiento")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneVencimiento")),
                        requiereRefrigeracion = lector.IsDBNull(lector.GetOrdinal("requiereRefrigeracion")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("requiereRefrigeracion")),
                        descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Insumos table by a foreign key.
        /// </summary>
        public IList<Insumos> ListarSemiPreparados()
        {
            var entidades = new List<Insumos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectInsumosSemiPreparados");

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Insumos
                    {
                        insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
                        nombre = lector.IsDBNull(lector.GetOrdinal("nombre")) ? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
                        unidad = lector.IsDBNull(lector.GetOrdinal("unidad")) ? default(string) : lector.GetString(lector.GetOrdinal("unidad")),
                        preparacionBasica = lector.IsDBNull(lector.GetOrdinal("preparacionBasica")) ? default(float) : lector.GetDouble(lector.GetOrdinal("preparacionBasica")),
                        vendible = lector.IsDBNull(lector.GetOrdinal("vendible")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("vendible")),
                        precio = lector.IsDBNull(lector.GetOrdinal("precio")) ? default(decimal) : MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precio"))),
                        stock = MathExpression.Round(lector.GetDouble(lector.GetOrdinal("stock"))),
                        costo = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("costo"))),
                        tieneLote = lector.IsDBNull(lector.GetOrdinal("tieneLote")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneLote")),
                        tieneVencimiento = lector.IsDBNull(lector.GetOrdinal("tieneVencimiento")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneVencimiento")),
                        requiereRefrigeracion = lector.IsDBNull(lector.GetOrdinal("requiereRefrigeracion")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("requiereRefrigeracion")),
                        descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Insumos table by a foreign key.
        /// </summary>
        public IList<Insumos> ListarInsumos()
        {
            var entidades = new List<Insumos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectInsumosDeFacto");

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Insumos
                    {
                        insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
                        nombre = lector.IsDBNull(lector.GetOrdinal("nombre")) ? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
                        unidad = lector.IsDBNull(lector.GetOrdinal("unidad")) ? default(string) : lector.GetString(lector.GetOrdinal("unidad")),
                        preparacionBasica = lector.IsDBNull(lector.GetOrdinal("preparacionBasica")) ? default(float) : lector.GetDouble(lector.GetOrdinal("preparacionBasica")),
                        vendible = lector.IsDBNull(lector.GetOrdinal("vendible")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("vendible")),
                        precio = lector.IsDBNull(lector.GetOrdinal("precio")) ? default(decimal) : MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precio"))),
                        stock = MathExpression.Round(lector.GetDouble(lector.GetOrdinal("stock"))),
                        costo = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("costo"))),
                        tieneLote = lector.IsDBNull(lector.GetOrdinal("tieneLote")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneLote")),
                        tieneVencimiento = lector.IsDBNull(lector.GetOrdinal("tieneVencimiento")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneVencimiento")),
                        requiereRefrigeracion = lector.IsDBNull(lector.GetOrdinal("requiereRefrigeracion")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("requiereRefrigeracion")),
                        descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Insumos table by a foreign key.
        /// </summary>
        public IList<Insumos> ListarByVendible(bool vendible)
        {
            var entidades = new List<Insumos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectInsumosByVendible");

            BaseDatos.AddInParameter(comando, "vendible", DbType.Boolean, vendible);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Insumos
                    {
                        insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
                        nombre = lector.IsDBNull(lector.GetOrdinal("nombre")) ? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
                        unidad = lector.IsDBNull(lector.GetOrdinal("unidad")) ? default(string) : lector.GetString(lector.GetOrdinal("unidad")),
                        preparacionBasica = lector.IsDBNull(lector.GetOrdinal("preparacionBasica")) ? default(float) : lector.GetDouble(lector.GetOrdinal("preparacionBasica")),
                        vendible = lector.IsDBNull(lector.GetOrdinal("vendible")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("vendible")),
                        precio = lector.IsDBNull(lector.GetOrdinal("precio")) ? default(decimal) : MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precio"))),
                        stock = MathExpression.Round(lector.GetDouble(lector.GetOrdinal("stock"))),
                        costo = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("costo"))),
                        tieneLote = lector.IsDBNull(lector.GetOrdinal("tieneLote")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneLote")),
                        tieneVencimiento = lector.IsDBNull(lector.GetOrdinal("tieneVencimiento")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneVencimiento")),
                        requiereRefrigeracion = lector.IsDBNull(lector.GetOrdinal("requiereRefrigeracion")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("requiereRefrigeracion")),
                        descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

		/// <summary>
		/// Selects all records from the Insumos table by a foreign key.
		/// </summary>
        public IList<Insumos> Listar()
		{
			var entidades = new List<Insumos>();
            var comando = BaseDatos.GetStoredProcCommand("SelectAllInsumos");

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Insumos
					{
						insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
						nombre = lector.IsDBNull(lector.GetOrdinal("nombre"))? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
						unidad = lector.IsDBNull(lector.GetOrdinal("unidad"))? default(string) : lector.GetString(lector.GetOrdinal("unidad")),
                        preparacionBasica = lector.IsDBNull(lector.GetOrdinal("preparacionBasica")) ? default(float) : lector.GetDouble(lector.GetOrdinal("preparacionBasica")),
                        vendible = lector.IsDBNull(lector.GetOrdinal("vendible")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("vendible")),
                        precio = lector.IsDBNull(lector.GetOrdinal("precio")) ? default(decimal) : MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precio"))),
                        stock = MathExpression.Round(lector.GetDouble(lector.GetOrdinal("stock"))),
                        costo = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("costo"))),
                        tieneLote = lector.IsDBNull(lector.GetOrdinal("tieneLote")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneLote")),
                        tieneVencimiento = lector.IsDBNull(lector.GetOrdinal("tieneVencimiento")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneVencimiento")),
                        requiereRefrigeracion = lector.IsDBNull(lector.GetOrdinal("requiereRefrigeracion")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("requiereRefrigeracion")),
						descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion"))? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Insumos table by a foreign key.
		/// </summary>
		public Insumos Obtener(short insumoID)
		{
			var insumos = default(Insumos);
			var comando = BaseDatos.GetStoredProcCommand("SelectInsumos");

			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					insumos = new Insumos
					{
						insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
						nombre = lector.IsDBNull(lector.GetOrdinal("nombre"))? default(string) : lector.GetString(lector.GetOrdinal("nombre")),
                        unidad = lector.IsDBNull(lector.GetOrdinal("unidad")) ? default(string) : lector.GetString(lector.GetOrdinal("unidad")),
                        preparacionBasica = lector.IsDBNull(lector.GetOrdinal("preparacionBasica")) ? default(float) : lector.GetDouble(lector.GetOrdinal("preparacionBasica")),
                        vendible = lector.IsDBNull(lector.GetOrdinal("vendible")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("vendible")),
                        precio = lector.IsDBNull(lector.GetOrdinal("precio")) ? default(decimal) : MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precio"))),
                        stock = MathExpression.Round(lector.GetDouble(lector.GetOrdinal("stock"))),
                        costo = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("costo"))),
                        tieneLote = lector.IsDBNull(lector.GetOrdinal("tieneLote")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneLote")),
                        tieneVencimiento = lector.IsDBNull(lector.GetOrdinal("tieneVencimiento")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("tieneVencimiento")),
                        requiereRefrigeracion = lector.IsDBNull(lector.GetOrdinal("requiereRefrigeracion")) ? default(bool) : lector.GetBoolean(lector.GetOrdinal("requiereRefrigeracion")),
                        descripcion = lector.IsDBNull(lector.GetOrdinal("descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("descripcion"))
					};
				}
			}
			comando.Dispose();
			return insumos;
        }

        #endregion

        #region Escritura

        /// <summary>
		/// Saves a record to the Insumos table.
		/// </summary>
		public short Agregar(Insumos insumos)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertInsumos");
			BaseDatos.AddOutParameter(comando, "insumoID", DbType.Int16, 2);
			BaseDatos.AddInParameter(comando, "nombre", DbType.String, insumos.nombre);
			BaseDatos.AddInParameter(comando, "unidad", DbType.String, insumos.unidad);
			BaseDatos.AddInParameter(comando, "preparacionBasica", DbType.Single, insumos.preparacionBasica);
            BaseDatos.AddInParameter(comando, "vendible", DbType.Boolean, insumos.vendible);
            BaseDatos.AddInParameter(comando, "precio", DbType.Currency, insumos.precio.HasValue ? MathExpression.Round(insumos.precio.Value) : insumos.precio);
            BaseDatos.AddInParameter(comando, "tieneLote", DbType.Boolean, insumos.tieneLote);
            BaseDatos.AddInParameter(comando, "tieneVencimiento", DbType.Boolean, insumos.tieneVencimiento);
            BaseDatos.AddInParameter(comando, "requiereRefrigeracion", DbType.Boolean, insumos.requiereRefrigeracion);
			BaseDatos.AddInParameter(comando, "descripcion", DbType.String, insumos.descripcion);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar Insumos.");

			var valorDevuelto = (short)BaseDatos.GetParameterValue(comando, "insumoID");;
			comando.Dispose();
			return valorDevuelto;
        }

        /// <summary>
        /// Saves a record to the Productos table.
        /// </summary>
        public bool Modificar(Insumos insumo)
        {
            using (DbConnection conexion = BaseDatos.CreateConnection())
            {
                conexion.Open();
                DbTransaction transaccion = conexion.BeginTransaction();

                try
                {
                    this.ModificarBase(insumo, transaccion);
                    LotesData.Instancia.DesactivarByInsumoAndOpciones(insumo.insumoID, insumo.tieneLote, insumo.tieneVencimiento, transaccion);
                    transaccion.Commit();
                }
                catch (Exception)
                {
                    transaccion.Rollback();
                    throw new Exception("Error al modificar insumo");
                }
                conexion.Close();
            }
            return true;
        }

        /// <summary>
        /// Updates a record in the Insumos table.
        /// </summary>
        public bool ModificarStock(int insumoID, double variacionStock, DbTransaction transaccion)
        {
            var comando = BaseDatos.GetStoredProcCommand("UpdateInsumosStock");
            BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);
            BaseDatos.AddInParameter(comando, "variacionStock", DbType.Single, MathExpression.Round(variacionStock));

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
            if (resultado == 0) throw new Exception("Error al Modificar Stock de Insumos.");

            comando.Dispose();
            return true;
        }

        /// <summary>
        /// Updates a record in the Insumos table.
        /// </summary>
        public bool ModificarStockAndCosto(int insumoID, double variacionStock, decimal variacionCosto, DbTransaction transaccion)
        {
            var comando = BaseDatos.GetStoredProcCommand("UpdateInsumosStockAndCosto");
            BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);
            BaseDatos.AddInParameter(comando, "variacionStock", DbType.Single, MathExpression.Round(variacionStock));
            BaseDatos.AddInParameter(comando, "variacionCosto", DbType.Decimal, MathExpression.Round(variacionCosto));

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
            if (resultado == 0) throw new Exception("Error al Modificar Stock de Insumos.");

            comando.Dispose();
            return true;
        }

		/// <summary>
		/// Deletes a record from the Insumos table by its primary key.
		/// </summary>
		public bool Eliminar(short insumoID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteInsumos");
			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Insumos.");
			comando.Dispose();
			return true;
        }

        #endregion

        #region Bases

        /// <summary>
        /// Saves a record to the Insumos table.
        /// </summary>
        private short AgregarBase(Insumos semiTerminado, DbTransaction transaccion)
        {
            var comando = BaseDatos.GetStoredProcCommand("InsertInsumos");
            BaseDatos.AddOutParameter(comando, "insumoID", DbType.Int16, 2);
            BaseDatos.AddInParameter(comando, "nombre", DbType.String, semiTerminado.nombre);
            BaseDatos.AddInParameter(comando, "unidad", DbType.String, semiTerminado.unidad);
            BaseDatos.AddInParameter(comando, "preparacionBasica", DbType.Single, semiTerminado.preparacionBasica);
            BaseDatos.AddInParameter(comando, "vendible", DbType.Boolean, semiTerminado.vendible);
            BaseDatos.AddInParameter(comando, "precio", DbType.Currency, semiTerminado.precio.HasValue ? MathExpression.Round(semiTerminado.precio.Value) : semiTerminado.precio);
            BaseDatos.AddInParameter(comando, "tieneLote", DbType.Boolean, semiTerminado.tieneLote);
            BaseDatos.AddInParameter(comando, "tieneVencimiento", DbType.Boolean, semiTerminado.tieneVencimiento);
            BaseDatos.AddInParameter(comando, "requiereRefrigeracion", DbType.Boolean, semiTerminado.requiereRefrigeracion);
            BaseDatos.AddInParameter(comando, "descripcion", DbType.String, semiTerminado.descripcion);

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
            if (resultado == 0) throw new Exception("Error al Agregar SemiTerminado.");

            var valorDevuelto = (short)BaseDatos.GetParameterValue(comando, "insumoID"); ;
            comando.Dispose();
            return valorDevuelto;
        }

        /// <summary>
        /// Updates a record in the Insumos table.
        /// </summary>
        public bool ModificarBase(Insumos semiTerminado, DbTransaction transaccion)
        {
            var comando = BaseDatos.GetStoredProcCommand("UpdateInsumos");
            BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, semiTerminado.insumoID);
            BaseDatos.AddInParameter(comando, "nombre", DbType.String, semiTerminado.nombre);
            BaseDatos.AddInParameter(comando, "unidad", DbType.String, semiTerminado.unidad);
            BaseDatos.AddInParameter(comando, "preparacionBasica", DbType.Single, semiTerminado.preparacionBasica);
            BaseDatos.AddInParameter(comando, "vendible", DbType.Boolean, semiTerminado.vendible);
            BaseDatos.AddInParameter(comando, "precio", DbType.Currency, semiTerminado.precio.HasValue ? MathExpression.Round(semiTerminado.precio.Value) : semiTerminado.precio);
            BaseDatos.AddInParameter(comando, "tieneLote", DbType.Boolean, semiTerminado.tieneLote);
            BaseDatos.AddInParameter(comando, "tieneVencimiento", DbType.Boolean, semiTerminado.tieneVencimiento);
            BaseDatos.AddInParameter(comando, "requiereRefrigeracion", DbType.Boolean, semiTerminado.requiereRefrigeracion);
            BaseDatos.AddInParameter(comando, "descripcion", DbType.String, semiTerminado.descripcion);

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
            if (resultado == 0) throw new Exception("Error al Modificar SemiTerminado.");

            comando.Dispose();
            return true;
        }

        #endregion

        #region Transacciones

        /// <summary>
        /// Saves a record to the Productos table.
        /// </summary>
        public short AgregarSemiTerminados(Insumos semiTerminado)
        {
            short semiTerminadoID;
            using (DbConnection conexion = BaseDatos.CreateConnection())
            {
                conexion.Open();
                DbTransaction transaccion = conexion.BeginTransaction();

                try
                {
                    semiTerminadoID = this.AgregarBase(semiTerminado, transaccion);
                    foreach (SemiProductos_Insumos detalle in semiTerminado.SemiProductos_Insumos1)
                    {
                        SemiProductos_InsumosData.Instancia.Agregar(semiTerminadoID, detalle, transaccion);
                    }
                    transaccion.Commit();
                }
                catch (Exception)
                {
                    transaccion.Rollback();
                    throw;
                }
                conexion.Close();
            }
            return semiTerminadoID;
        }

        /// <summary>
        /// Updates a record in the Productos table.
        /// </summary>
        public bool ModificarSemiTerminados(Insumos semiTerminado)
        {
            using (DbConnection conexion = BaseDatos.CreateConnection())
            {
                conexion.Open();
                DbTransaction transaccion = conexion.BeginTransaction();

                try
                {
                    this.ModificarBase(semiTerminado, transaccion);
                    LotesData.Instancia.DesactivarByInsumoAndOpciones(semiTerminado.insumoID, semiTerminado.tieneLote, semiTerminado.tieneVencimiento, transaccion);
                    SemiProductos_InsumosData.Instancia.EliminarPorSemiProductoID(semiTerminado.insumoID, transaccion);
                    foreach (SemiProductos_Insumos detalle in semiTerminado.SemiProductos_Insumos1)
                    {
                        SemiProductos_InsumosData.Instancia.Agregar(semiTerminado.insumoID, detalle, transaccion);
                    }
                    transaccion.Commit();
                }
                catch (Exception)
                {
                    transaccion.Rollback();
                    throw;
                }
                conexion.Close();
            }
            return true;
        }

        #endregion

        #endregion
    }
}
